<?php

namespace frontend\models;
use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use frontend\models\superModel;

/**
 * This is the model class for table "user".
 *
 * @property integer $id
 * @property string $username
 * @property string $auth_key
 * @property string $password_hash
 * @property string $password_reset_token
 * @property string $email
 * @property integer $status
 * @property string $created_at
 * @property string $updated_at
 */
class User extends superModel implements IdentityInterface{

    /**
     * @inheritdoc
     */
    const STATUS_DELETED = 0;
    const STATUS_ACTIVE = 10;

    public static function tableName() {
        return 'user';
    }

    public static function getCTableName() {
        return '用户';
    }

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
                [['username', 'auth_key', 'password_hash', 'email', 'created_at', 'updated_at'], 'required'],
                [['status'], 'integer'],
                [['created_at', 'updated_at'], 'safe'],
                [['username', 'password_hash', 'password_reset_token', 'email'], 'string', 'max' => 255],
                [['auth_key'], 'string', 'max' => 32],
                [['username'], 'unique'],
                [['email'], 'unique'],
                [['password_reset_token'], 'unique'],
                ['status', 'default', 'value' => self::STATUS_ACTIVE],
                ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels() {
        return [
            'id' => 'ID',
            'username' => '用户名',
            'auth_key' => 'Auth Key',
            'password_hash' => '密码',
            'password_reset_token' => 'Password Reset Token',
            'email' => '邮箱',
            'status' => 'Status',
            'created_at' => '创建时间',
            'updated_at' => '修改时间',
        ];
    }

    public function seekPass($data) {
        $model = self::findOne(['username' => $data['User']['username'], 'email' => $data['User']['email']]);
        if (isset($model)) {
            //做点有意义的事
            $time = time();
            $token = $this->createToken($data['User']['username'], $time);
            $mailer = Yii::$app->mailer->compose('seekpass', ['username' => $data['User']['username'], 'time' => $time, 'token' => $token]);
            $mailer->setFrom("13132693017@163.com");
            $mailer->setTo($data['User']['email']);
//            $mailer->setTo($data['User']['email']);
            $mailer->setSubject("桂智商城-找回密码");
            if ($mailer->send()) {
                return true;
            } else {
                return FALSE;
            }
        }
        return false;
    }

    public function createToken($Useruser, $time) {
        $token = md5(md5($Useruser) . base64_encode(Yii::$app->request->userIP) . md5($time));
        return $token;
    }

//    public function sendMail()
//    {
//        $mailer = Yii::$app->mailer->compose()
//                ->setFrom('13132693017@163.com')
//                ->setTo('13132693017@163.com')
//                ->setSubject('Message subject')
////                ->setTextBody('Plain text content')
//                ->setHtmlBody('<b>HTML content</b>');
//
//        echo "<pre>";
//        var_dump($mailer->send());
//        echo "</pre>";
//        exit;
//    }




    public function setUpdateTime() {
        $this->updated_at = $this->getDateTime();
    }

    public function cryptPassword($password) {

        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

    public function beforeSave($insert) {

        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) {
                $this->setcreateTime();
            }
            $this->setUpdateTime();
        }
        return TRUE;
    }

    public function behaviors() {
        return [
            TimestampBehavior::className(),
        ];
    }

    /**
     * @inheritdoc
     */

    /**
     * @inheritdoc
     */
    public static function findIdentity($id) {
        return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null) {
        throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
    }

    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username) {
        return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
    }

    /**
     * Finds user by password reset token
     *
     * @param string $token password reset token
     * @return static|null
     */
    public static function findByPasswordResetToken($token) {
        if (!static::isPasswordResetTokenValid($token)) {
            return null;
        }

        return static::findOne([
                    'password_reset_token' => $token,
                    'status' => self::STATUS_ACTIVE,
        ]);
    }

    /**
     * Finds out if password reset token is valid
     *
     * @param string $token password reset token
     * @return boolean
     */
    public static function isPasswordResetTokenValid($token) {
        if (empty($token)) {
            return false;
        }

        $timestamp = (int) substr($token, strrpos($token, '_') + 1);
        $expire = Yii::$app->params['user.passwordResetTokenExpire'];
        return $timestamp + $expire >= time();
    }

    /**
     * @inheritdoc
     */
    public function getId() {
        return $this->getPrimaryKey();
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey() {
        return $this->auth_key;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey) {
        return $this->getAuthKey() === $authKey;
    }

    /**
     * Validates password
     *
     * @param string $password password to validate
     * @return boolean if password provided is valid for current user
     */
    public function validatePassword($password) {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }

    /**
     * Generates password hash from password and sets it to the model
     *
     * @param string $password
     */
    public function setPassword($password) {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

    /**
     * Generates "remember me" authentication key
     */
    public function generateAuthKey() {
        $this->auth_key = Yii::$app->security->generateRandomString();
    }

    /**
     * Generates new password reset token
     */
    public function generatePasswordResetToken() {
        $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
    }

    /**
     * Removes password reset token
     */
    public function removePasswordResetToken() {
        $this->password_reset_token = null;
    }

    public function setcreateTime() {
        $this->created_at = $this->getDateTime();
    }

}
